package config

import (
	"os"
	"path/filepath"
	"time"

	"gopkg.in/yaml.v3"
)

// Config 全局配置结构体（可根据项目扩展其他配置，如Redis、日志等）
type Config struct {
	Model struct {
		Ark struct {
			ModelId string `yaml:"modelId"` // ARK 模型ID
			APIKey  string `yaml:"apiKey"`  // ARK 模型的 API Key
		} `yaml:"ark"`
	} `yaml:"model"`
	MySQL MySQLConfig  `yaml:"mysql"` // 嵌套MySQL配置
	Log   LogConfig    `yaml:"log"`   // 日志配置
	Cors  CorsConfig   `yaml:"cors"`  // 日志配置
	JWT   JWTConfig    `yaml:"jwt"`   // 日志配置
	Redis RedisConfig  `yaml:"redis"` // 日志配置
	Task  []TaskConfig `yaml:"task"`  // 日志配置
	Amap  AmapConfig   `yaml:"amap"`  // 日志配置
}

type TaskConfig struct {
	Cron string `yaml:"cron"`
	Name string `yaml:"name"`
}

type RedisConfig struct {
	Addr         string        `yaml:"addr"`
	Password     string        `yaml:"password"`
	DB           int           `yaml:"db"`
	PoolSize     int           `yaml:"pool_size"`
	MinIdleConns int           `yaml:"min_idle_conns"`
	IdleTimeout  time.Duration `yaml:"idle_timeout"`
}

// LogConfig 日志配置参数
type LogConfig struct {
	Level      string `yaml:"level"`       // 日志级别：debug/info/warn/error
	Output     string `yaml:"output"`      // 输出方式：console/file/both
	FileDir    string `yaml:"file_dir"`    // 日志文件目录（output为file/both时有效）
	MaxSize    int    `yaml:"max_size"`    // 单个文件最大大小（MB）
	MaxBackups int    `yaml:"max_backups"` // 保留备份文件数
	MaxAge     int    `yaml:"max_age"`     // 保留天数（天）
	Compress   bool   `yaml:"compress"`    // 是否压缩备份文件
}

type CorsConfig struct {
	AllowOrigins []string `yaml:"allow_origins"`
}

// MySQLConfig MySQL连接配置（包含连接池参数）
type MySQLConfig struct {
	DSN             string `yaml:"dsn"`             // 连接字符串
	MaxOpenConns    int    `yaml:"maxOpenConns"`    // 最大打开连接数
	MaxIdleConns    int    `yaml:"maxIdleConns"`    // 最大空闲连接数
	ConnMaxLifetime int    `yaml:"connMaxLifetime"` // 连接最大存活时间（秒）
	ConnMaxIdleTime int    `yaml:"connMaxIdleTime"` // 连接最大空闲时间（秒）
}

type AmapConfig struct {
	JsApiKey  string `yaml:"js_api_key"`
	WebApiKey string `yaml:"web_api_key"`
}

type JWTConfig struct {
	JWTSecret string `yaml:"jwt_secret"`
}

// Cfg 全局配置实例（供外部调用）
var Cfg Config

// Init 初始化配置（从文件加载）
// env 可选参数：指定环境（如 "dev"、"prod"），为空则加载默认配置
func Init(env string) error {
	// 确定配置文件路径
	filename := "config.yaml"
	if env != "" {
		filename = "config." + env + ".yaml"
	}

	// 拼接完整路径（支持从项目根目录或config子目录加载）
	paths := []string{
		filename,                          // 项目根目录（如config.dev.yaml）
		filepath.Join("config", filename), // config子目录（如config/config.yaml）
	}

	var (
		content []byte
		err     error
	)
	// 尝试从多个路径加载配置文件
	for _, path := range paths {
		content, err = os.ReadFile(path)
		if err == nil {
			break // 找到第一个存在的文件
		}
	}
	if err != nil {
		return err // 所有路径都加载失败
	}

	// 解析YAML到结构体
	return yaml.Unmarshal(content, &Cfg)
}
